﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class AssignPatientForm : Form
    {
        private int patientId;
        private Control control;
        private TerminInfo oldTermin;

        public AssignPatientForm(int id, TerminInfo _oldTermin = null)
        {
            patientId = id;
            oldTermin = _oldTermin;
            control = Control.getInstance();
            InitializeComponent();
            InitializeLabels();
        }

        public void InitializeLabels()
        {
            System.Data.Odbc.OdbcDataReader result = control.ExecuteQuery("SELECT imie, nazwisko FROM pacjent WHERE id_pacjent = " + patientId + ";");
            if(!result.Read())
            {
                MessageBox.Show("Wybrany pacjent nie istnieje w bazie danych!", "Pacjent nie istnieje", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            this.Text = "Zapisz pacjenta " + result.GetString(0) + " " + result.GetString(1);
            LB_PatientName.Text = result.GetString(0) + " " + result.GetString(1);

            if (oldTermin != null)
            {
                DT_TerminZapisu.Text = oldTermin.czasFull;
            }
        }

        private void OnFormClose(object sender, EventArgs e)
        {
            Control.getInstance().CloseWindow(this);
        }

        public void ReaddDoctors()
        {
            DateTime dtDate = DT_TerminZapisu.Value;
            String dayStr = "MON";
            switch(dtDate.DayOfWeek)
            {
                case DayOfWeek.Monday: dayStr = "MON"; break;
                case DayOfWeek.Tuesday: dayStr = "TUE"; break;
                case DayOfWeek.Wednesday: dayStr = "WED"; break;
                case DayOfWeek.Thursday: dayStr = "THU"; break;
                case DayOfWeek.Friday: dayStr = "FRI"; break;
                case DayOfWeek.Saturday: dayStr = "SAT"; break;
                case DayOfWeek.Sunday: dayStr = "SUN"; break;
            }
            bool bWeekday = !(dayStr.Equals("SAT") || dayStr.Equals("SUN"));

            String connStr = "SELECT s.id, s.first_name, s.last_name, s.PESEL FROM staff s INNER JOIN lekarz_terminy lt ON lt.id_lekarza = s.id " +
                                "WHERE dzien = 'ALL_WEEK' OR " +
                                "dzien = '" + (bWeekday ? "ALL_WEEKDAYS" : "ALL_WEEKEND") + "' OR " +
                                "dzien = '" + dayStr + "' GROUP BY s.id;";
            System.Data.Odbc.OdbcDataReader result = control.ExecuteQuery(connStr);

            CB_ChooseLekarz.Items.Clear();
            if (result.HasRows)
                CB_ChooseLekarz.Items.Add("-- Wybierz Lekarza --");
            else
                CB_ChooseLekarz.Items.Add("-- Brak lekarzy w tym terminie --");

            while (result.Read())
            {
                Lekarz lekarz = new Lekarz(result.GetInt32(0), result.GetString(1), result.GetString(2), result.GetInt64(3));
                connStr = "SELECT dzien, godzina_start, godzina_koniec FROM lekarz_terminy WHERE (id_lekarza = " + result.GetInt32(0) +
                                ") AND (dzien = 'ALL_WEEK' OR " +
                                "dzien = '" + (bWeekday ? "ALL_WEEKDAYS" : "ALL_WEEKEND") + "' OR " +
                                "dzien = '" + dayStr + "');";
                System.Data.Odbc.OdbcDataReader result2 = control.ExecuteQuery(connStr);

                while(result2.Read())
                {
                    TerminDzien dzien = Lekarz.ToTerminDzien(result2.GetString(0));
                    LekarzTime start = new LekarzTime(result2.GetString(1));
                    LekarzTime end = new LekarzTime(result2.GetString(2));

                    DateTime termin = new DateTime(dtDate.Year, dtDate.Month, dtDate.Day, start.Hour, start.Minutes, 0);

                    connStr = "SELECT DISTINCT id_pacjenta FROM pacjent_zapis WHERE data_wizyty = '" + termin + "';";
                    System.Data.Odbc.OdbcDataReader zajete = control.ExecuteQuery(connStr);

                    // Jeśli jest w bazie pacjent zapisany na tą godzinę, nie dodajemy wolnego terminu
                    if(!zajete.Read())
                        lekarz.AddTermin(dzien, start, end);
                }

                CB_ChooseLekarz.Items.Add(lekarz);
            }
            CB_ChooseLekarz.SelectedIndex = 0;
        }

        public void ReaddHours()
        {
            if (CB_ChooseLekarz.SelectedItem.GetType().ToString().Equals("WindowsFormsApplication1.Lekarz"))
            {
                Lekarz lekarz = (Lekarz)CB_ChooseLekarz.SelectedItem;

                CB_ChooseHour.Items.Clear();
                CB_ChooseHour.Items.Add("-- Wybierz godzinę --");

                foreach (LekarzTermin t in lekarz.GetTerminy())
                {
                    CB_ChooseHour.Items.Add(t.ToString());
                }
            }
        }

        public void ShowZapisControlsLekarz(bool show)
        {
            if (show)
            {
                LB_ChooseLekarz.Visible = true;
                CB_ChooseLekarz.Visible = true;
                ReaddDoctors();
            }
            else
            {
                LB_ChooseHour.Visible = false;
                CB_ChooseHour.Visible = false;
                LB_ChooseLekarz.Visible = false;
                CB_ChooseLekarz.Visible = false;
                BT_Submit.Visible = false;
            }
        }

        public void ShowZapisControlsGodzina(bool show)
        {
            if (show)
            {
                LB_ChooseHour.Visible = true;
                CB_ChooseHour.Visible = true;
                ReaddHours();
            }
            else
            {
                LB_ChooseHour.Visible = false;
                CB_ChooseHour.Visible = false;
                BT_Submit.Visible = false;
            }
        }

        private void DT_TerminZapisu_ValueChanged(object sender, EventArgs e)
        {
            if (DT_TerminZapisu.Value < DateTime.Now)
                ShowZapisControlsLekarz(false);
            else
                ShowZapisControlsLekarz(true);
        }

        private void CB_ChooseLekarz_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (CB_ChooseLekarz.SelectedIndex.Equals(0))
                ShowZapisControlsGodzina(false);
            else
                ShowZapisControlsGodzina(true);
        }

        private void CB_ChooseHour_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (CB_ChooseHour.SelectedIndex.Equals(0))
                BT_Submit.Visible = false;
            else
                BT_Submit.Visible = true;
        }

        private void BT_Submit_Click(object sender, EventArgs e)
        {
            if (CB_ChooseHour.SelectedIndex.Equals(0))
            {
                MessageBox.Show("Wybierz poprawną godzinę!", "Niewłaściwe dane", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                if (oldTermin != null)
                {
                    String connStr = "DELETE FROM pacjent_zapis WHERE id_pacjenta = " + patientId + " AND id_lekarza = " + oldTermin.LekarzId +
                    " AND data_wizyty = '" + oldTermin.czasFull + "';";
                    control.ExecuteStmt(connStr);
                }

                if (CB_ChooseLekarz.SelectedItem.GetType().ToString().Equals("WindowsFormsApplication1.Lekarz"))
                {
                    Lekarz lekarz = (Lekarz)CB_ChooseLekarz.SelectedItem;
                    List<LekarzTermin> terminy = lekarz.GetTerminy();

                    if (terminy.Count < CB_ChooseHour.SelectedIndex)
                    {
                        MessageBox.Show("Wybierz poprawną godzinę!", "Niewłaściwe dane", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else
                    {
                        LekarzTermin t = terminy.ElementAt(CB_ChooseHour.SelectedIndex - 1);
                        DateTime dtDate = DT_TerminZapisu.Value;
                        DateTime termin = new DateTime(dtDate.Year, dtDate.Month, dtDate.Day, t.godzStart.Hour, t.godzStart.Minutes, 0);
                        String connStr = "INSERT INTO pacjent_zapis (id_pacjenta, id_lekarza, data_wizyty, uwagi) VALUES (" +
                                         patientId + ", " +
                                         lekarz.GetId() + ", '" +
                                         termin.ToString() + "', '" +
                                         "" + "');";

                        control.ExecuteStmt(connStr);
                        MessageBox.Show("Pomyślnie zapisano dane do bazy", "Zapis pomyślny", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
                else
                    MessageBox.Show("Błąd wewnętrzny", "Nieokreślony błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            this.Close();
        }
    }
}
